[Lighttpd] w chroot z obsługą PHP i MySQL

Kategoria: FAQ, etykiety: bazy danych, lighttpd

Dodany: 2010-09-28 15:27 (zmodyfikowany: 2011-04-17 23:29)
Przez: life

Wyświetleń: 7988

Opis powstał w oparciu o informacje znajdujące się na stronie: http://www.cyberciti.biz

Rozwiązanie to testowałem w Debian 5 (Lenny) wersja 32 bit.

Zakładam że masz już zainstalowanego Lighttpd oraz PHP oraz MySQL jeśli nie to instalujemy: PHP z Lighttpd działa w trybie Fast-CGI tak więc musiamy zainstalować pakiet php5-cgi

# apt-get install lighttpd php5-cgi php5-mysql mysql-server

Teraz przystąpimy do przygotowania środowiska w którym będą działać usługi.

Zakładamy katalog /chroot:

# mkdir /chroot

Nasz chroot powinien mieć niezbędną struturę i system katalogów normalnego systemu, dlatego też zakładamy następujące podkatalogi i uprawnienia dla nich:

# mkdir /chroot/tmp/
# chmod 1777 /chroot/tmp/
# mkdir /chroot/etc

Katalog w którym będziemy trzymać logi Lighttpd:

# mkdir -p /chroot/var/log/lighttpd

Lighttpd domyślnie działa na uprawnieniach użytkownika www-data dlatego też zmieniamy właściciela katalogu w którym będziemy trzymać logi:

# chown www-data:www-data /chroot/var/log/lighttpd

Utworzymy katalogi w których Lighttpd trzyma cache:

# mkdir -p /chroot/var/tmp/lighttpd/cache/compress/
# chown www-data:www-data /chroot/var/tmp/lighttpd/cache/compress/

Oraz katalog do którego uploadowane są pliki:

# mkdir -p /chroot/var/cache/lighttpd/uploads
# chown www-data:www-data /chroot/var/cache/lighttpd/uploads

Tworzymy katalog domowy użytkownika w którym będziemy trzymać stronę:

# mkdir -p /chroot/home/lighttpd
# chown www-data:www-data /chroot/home/lighttpd
# chmod 0700 /chroot/home/lighttpd

Przy tworzeniu środowiska chroot przydatny jest skrypt l2chroot, który automatyzuje kopiowanie plików i bibliotek do nowego środowiska.

#!/bin/bash
BASE="/webroot"

if [ $# -eq 0 ]; then
  echo "Syntax : $0 /path/to/executable"
  echo "Example: $0 /usr/bin/php5-cgi"
  exit 1
fi

[ ! $BASE ] && mkdir -p $BASE || : 

# iggy ld-linux* file as it is not shared one
FILES="$(ldd $1 | awk '{ print $3 }' |egrep -v ^'\(')"

echo "Copying shared files/libs to $BASE..."
for i in $FILES
do
  d="$(dirname $i)"
  [ ! -d $BASE$d ] && mkdir -p $BASE$d || :
  /bin/cp $i $BASE$d
done

# copy /lib/ld-linux* or /lib64/ld-linux* to $BASE/$sldlsubdir
# get ld-linux full file location
sldl="$(ldd $1 | grep 'ld-linux' | awk '{ print $1}')"
# now get sub-dir
sldlsubdir="$(dirname $sldl)"

if [ ! -f $BASE$sldl ];
then
  echo "Copying $sldl $BASE$sldlsubdir..."
  /bin/cp $sldl $BASE$sldlsubdir
else
  :
fi

Można go pobrać tu l2chroot.

Skrypt zapisujemy na dysku i nadajemy mu uprawnienia do wykonywania:

# wget http://www.cyberciti.biz/files/lighttpd/l2chroot.txt
# cp l2chroot.txt /bin/l2chroot
# chmod +x /bin/l2chroot

Teraz potrzebujemy umieścić w chroot PHP wraz z modułami których będziemy potrzebować. Zaczniemy od utworzenia katalogów w których przechowywane są binaria oraz biblioteki:

# mkdir -p /chroot/usr/bin
# cp /usr/bin/php5-cgi /chroot/usr/bin/
# cp /usr/bin/php5 /chroot/usr/bin/

Kolejnym etapem jest przekopiowanie plików konfiguracyjnych (wraz z uprawnieniami) dla PHP:

# cd /chroot/etc/
# cp -avr /etc/php5 .

Potrzebujemy jeszcze skopiować inne pliki konfiguracyjne z katalogu /etc

# cp /etc/hosts /chroot/etc/
# cp /etc/nsswitch.conf /chroot/etc/
# cp /etc/resolv.conf /chroot/etc/
# cp /etc/services /chroot/etc/
# cp /etc/localtime /chroot/etc/

Przy pomocy skryptu l2chroot kopiujemy pliki binarne i biblioteki dl PHP:

# /bin/l2chroot /usr/bin/php5-cgi
# /bin/l2chroot /usr/bin/php-cgi

Do poprawnego działana chroot potrzebujemy jeszcze biblioteki ld-linux.so.2 :

# cp /lib/ld-linux.so.2 /chroot/lib

Teraz zabierzemy się za moduły dla PHP, które również umieścimy w chroot. Zaczniemy od sprawdzenia gdzie pliki się znajdują na dysku:

# dpkg -L php5-mysql

/.
/usr
/usr/share
/usr/share/doc
/usr/lib
/usr/lib/php5
/usr/lib/php5/20060613+lfs
/usr/lib/php5/20060613+lfs/mysql.so
/usr/lib/php5/20060613+lfs/mysqli.so
/usr/lib/php5/20060613+lfs/pdo_mysql.so
/etc
/etc/php5
/etc/php5/conf.d
/etc/php5/conf.d/mysql.ini
/etc/php5/conf.d/mysqli.ini
/etc/php5/conf.d/pdo_mysql.ini
/usr/share/doc/php5-mysql

Nas interesuja następujące linie:

/usr/lib/php5/20060613+lfs/mysql.so
/usr/lib/php5/20060613+lfs/mysqli.so
/usr/lib/php5/20060613+lfs/pdo_mysql.so

Są to ścieżki do plików z modułami do sterownika bazy danych MySQL.

Musimy założyć katalog dla modułów a następnie skopiować je:

# mkdir -p /chroot/usr/lib/php4/20050606
# cp /usr/lib/php5/20060613+lfs/mysql.so /chroot/usr/lib/php5/20060613+lfs/
# cp /usr/lib/php5/20060613+lfs/mysqli.so /chroot/usr/lib/php5/20060613+lfs/
# cp /usr/lib/php5/20060613+lfs/pdo_mysql.so /chroot/usr/lib/php5/20060613+lfs/

Przy pomocy skryptu l2chroot kopiujemy potrzebne biblioteki:

# /bin/l2chroot /usr/lib/php5/20060613+lfs/mysql.so
# /bin/l2chroot /usr/lib/php5/20060613+lfs/mysqli.so
# /bin/l2chroot /usr/lib/php5/20060613+lfs/pdo_mysql.so

Powyższe czynności należy powtórzyć dla innych modułów jakich używamy jak GD, xcache itp.

Teraz przejdziemy do konfiguracji Lighttpd z obsługą PHP. Posłuży nam do tego skrypt lighty-enable-mod, dostarczany wraz z lighttpd.

# lighty-enable-mod fastcgi

Pozostaje jeszcze edycja pliku konfiguracyjnego Lighttpd (/etc/lighttpd/lighttpd.conf ). Otwieramy w naszym ulubionym edytorze tekstu i zmieniamy (edytujemy) linie:

server.chroot  = "/chroot"

Domyślnie jest za komentowana znakiem „#”.

server.document-root  = "/home/lighttpd/"

Zanim zrestartujemy Lighttpd musimy wykonać jeszcze jedną czynność. Połączenie z bazą danych MySQL poprzez moduł mysql.so lub mysqli.so (wersja obiektowa). Powinna działać bez problemu, gorzej spraw się ma z obsługą PDO. Pomimo że komunikacja PHP – MySQL odbywa się poprzez połączenie TCP to najprawdopodobniej samo PDO używa gniazda do łącznie się z bazą danych (socket).

Domyślnie gniazdo dla MySQL znajduje się w katalogu /var/run/mysqld/mysqld.sock

Z poziomu chroot będzie ono niedostępne dlatego musimy zmienić jego pomożenie. Najpierw utworzymy katalog i zmienimy jego właściciela na mysql:

# mkdir -p /chroot/var/run/mysqld/
# chown mysql /chroot/var/run/mysqld/

Następnie edytujemy plik konfiguracyjny MySQL (/etc/mysql/my.cnf) i zmieniamy miejsce gdzie ma być zapisane gniazdo:

[client]
socket = /chroot/var/run/mysqld/mysqld.sock

[mysqld_safe]
socket = /chroot/var/run/mysqld/mysqld.sock

[mysqld]
socket = /chroot/var/run/mysqld/mysqld.sock

Debian posiada dodatkowe skrypty monitorujące pracę MySQL, musimy je powiadomić o tym, że plik gniazda zmienił swoje domyślne położenie. Edytujemy plik /etc/mysql/debian.cnf i sekcję socket ustawiamy na: socket = /chroot/var/run/mysqld/mysqld.sock

Teraz możemy zrestartować serwer bazy danych oraz lighttpd:

# /etc/init.d/mysql restart
# /etc/init.d/lighttpd restart

Nasz Lighttpd z obsługą PHP i MySQL powinien działać w środowisku chroot.

Dla sprawdzenia poprawności działania można użyć fuknkcji phpinfo() z PHP.

W katalogu /chroot/home/lighttpd tworzymy plik plik test.php i wpisujemy do niego zawartość:

<?php
phpinfo();
?>

Wchodząc na adres http://naszadresip/test.php powinniśmy zobaczyć rezultat działania funkcji phpinfo()

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks